home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / xain.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  6KB  |  219 lines

  1. /***************************************************************************
  2.  
  3.   vidhrdw.c
  4.  
  5.   Functions to emulate the video hardware of the machine.
  6.  
  7. ***************************************************************************/
  8.  
  9. #include "driver.h"
  10. #include "vidhrdw/generic.h"
  11.  
  12. unsigned char *xain_charram, *xain_bgram0, *xain_bgram1;
  13.  
  14. static struct tilemap *char_tilemap, *bgram0_tilemap, *bgram1_tilemap;
  15. static int flipscreen;
  16.  
  17.  
  18. /***************************************************************************
  19.  
  20.   Callbacks for the TileMap code
  21.  
  22. ***************************************************************************/
  23.  
  24. static UINT32 back_scan(UINT32 col,UINT32 row,UINT32 num_cols,UINT32 num_rows)
  25. {
  26.     /* logical (col,row) -> memory offset */
  27.     return (col & 0x0f) + ((row & 0x0f) << 4) + ((col & 0x10) << 4) + ((row & 0x10) << 5);
  28. }
  29.  
  30. static void get_bgram0_tile_info(int tile_index)
  31. {
  32.     int attr = xain_bgram0[tile_index | 0x400];
  33.     SET_TILE_INFO(2,xain_bgram0[tile_index] | ((attr & 7) << 8),(attr & 0x70) >> 4);
  34.     tile_info.flags = (attr & 0x80) ? TILE_FLIPX : 0;
  35. }
  36.  
  37. static void get_bgram1_tile_info(int tile_index)
  38. {
  39.     int attr = xain_bgram1[tile_index | 0x400];
  40.     SET_TILE_INFO(1,xain_bgram1[tile_index] | ((attr & 7) << 8),(attr & 0x70) >> 4);
  41.     tile_info.flags = (attr & 0x80) ? TILE_FLIPX : 0;
  42. }
  43.  
  44. static void get_char_tile_info(int tile_index)
  45. {
  46.     int attr = xain_charram[tile_index | 0x400];
  47.     SET_TILE_INFO(0,xain_charram[tile_index] | ((attr & 3) << 8),(attr & 0xe0) >> 5);
  48. }
  49.  
  50.  
  51. /***************************************************************************
  52.  
  53.   Start the video hardware emulation.
  54.  
  55. ***************************************************************************/
  56.  
  57. int xain_vh_start(void)
  58. {
  59.     bgram0_tilemap = tilemap_create(get_bgram0_tile_info,back_scan,    TILEMAP_OPAQUE,     16,16,32,32);
  60.     bgram1_tilemap = tilemap_create(get_bgram1_tile_info,back_scan,    TILEMAP_TRANSPARENT,16,16,32,32);
  61.     char_tilemap = tilemap_create(get_char_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT, 8, 8,32,32);
  62.  
  63.     if (!bgram0_tilemap || !bgram1_tilemap || !char_tilemap)
  64.         return 1;
  65.  
  66.     bgram1_tilemap->transparent_pen = 0;
  67.     char_tilemap->transparent_pen = 0;
  68.  
  69.     return 0;
  70. }
  71.  
  72.  
  73.  
  74. /***************************************************************************
  75.  
  76.   Memory handlers
  77.  
  78. ***************************************************************************/
  79.  
  80. WRITE_HANDLER( xain_bgram0_w )
  81. {
  82.     if (xain_bgram0[offset] != data)
  83.     {
  84.         xain_bgram0[offset] = data;
  85.         tilemap_mark_tile_dirty(bgram0_tilemap,offset & 0x3ff);
  86.     }
  87. }
  88.  
  89. WRITE_HANDLER( xain_bgram1_w )
  90. {
  91.     if (xain_bgram1[offset] != data)
  92.     {
  93.         xain_bgram1[offset] = data;
  94.         tilemap_mark_tile_dirty(bgram1_tilemap,offset & 0x3ff);
  95.     }
  96. }
  97.  
  98. WRITE_HANDLER( xain_charram_w )
  99. {
  100.     if (xain_charram[offset] != data)
  101.     {
  102.         xain_charram[offset] = data;
  103.         tilemap_mark_tile_dirty(char_tilemap,offset & 0x3ff);
  104.     }
  105. }
  106.  
  107. WRITE_HANDLER( xain_scrollxP0_w )
  108. {
  109.     static unsigned char xain_scrollxP0[2];
  110.  
  111.     xain_scrollxP0[offset] = data;
  112.     tilemap_set_scrollx(bgram0_tilemap, 0, xain_scrollxP0[0]|(xain_scrollxP0[1]<<8));
  113. }
  114.  
  115. WRITE_HANDLER( xain_scrollyP0_w )
  116. {
  117.     static unsigned char xain_scrollyP0[2];
  118.  
  119.     xain_scrollyP0[offset] = data;
  120.     tilemap_set_scrolly(bgram0_tilemap, 0, xain_scrollyP0[0]|(xain_scrollyP0[1]<<8));
  121. }
  122.  
  123. WRITE_HANDLER( xain_scrollxP1_w )
  124. {
  125.     static unsigned char xain_scrollxP1[2];
  126.  
  127.     xain_scrollxP1[offset] = data;
  128.     tilemap_set_scrollx(bgram1_tilemap, 0, xain_scrollxP1[0]|(xain_scrollxP1[1]<<8));
  129. }
  130.  
  131. WRITE_HANDLER( xain_scrollyP1_w )
  132. {
  133.     static unsigned char xain_scrollyP1[2];
  134.  
  135.     xain_scrollyP1[offset] = data;
  136.     tilemap_set_scrolly(bgram1_tilemap, 0, xain_scrollyP1[0]|(xain_scrollyP1[1]<<8));
  137. }
  138.  
  139.  
  140. WRITE_HANDLER( xain_flipscreen_w )
  141. {
  142.     flipscreen = data & 1;
  143.     tilemap_set_flip(ALL_TILEMAPS,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
  144. }
  145.  
  146.  
  147. /***************************************************************************
  148.  
  149.   Display refresh
  150.  
  151. ***************************************************************************/
  152.  
  153. static void draw_sprites(struct osd_bitmap *bitmap)
  154. {
  155.     int offs;
  156.  
  157.     for (offs = 0; offs < spriteram_size;offs += 4)
  158.     {
  159.         int sx,sy,flipx;
  160.         int attr = spriteram[offs+1];
  161.         int numtile = spriteram[offs+2] | ((attr & 7) << 8);
  162.         int color = (attr & 0x38) >> 3;
  163.  
  164.         sx = 239 - spriteram[offs+3];
  165.         if (sx <= -7) sx += 256;
  166.         sy = 240 - spriteram[offs];
  167.         if (sy <= -7) sy += 256;
  168.         flipx = attr & 0x40;
  169.         if (flipscreen)
  170.         {
  171.             sx = 239 - sx;
  172.             sy = 240 - sy;
  173.             flipx = !flipx;
  174.         }
  175.  
  176.         if (attr & 0x80)    /* double height */
  177.         {
  178.             drawgfx(bitmap,Machine->gfx[3],
  179.                     numtile,
  180.                     color,
  181.                     flipx,flipscreen,
  182.                     sx-1,flipscreen?sy+16:sy-16,
  183.                     &Machine->drv->visible_area,TRANSPARENCY_PEN,0);
  184.             drawgfx(bitmap,Machine->gfx[3],
  185.                     numtile+1,
  186.                     color,
  187.                     flipx,flipscreen,
  188.                     sx-1,sy,
  189.                     &Machine->drv->visible_area,TRANSPARENCY_PEN,0);
  190.         }
  191.         else
  192.         {
  193.             drawgfx(bitmap,Machine->gfx[3],
  194.                     numtile,
  195.                     color,
  196.                     flipx,flipscreen,
  197.                     sx,sy,
  198.                     &Machine->drv->visible_area,TRANSPARENCY_PEN,0);
  199.         }
  200.     }
  201. }
  202.  
  203. void xain_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  204. {
  205.     tilemap_update(ALL_TILEMAPS);
  206.  
  207.     palette_init_used_colors();
  208.     memset(palette_used_colors+128,PALETTE_COLOR_USED,128);    /* sprites */
  209.     if (palette_recalc())
  210.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  211.  
  212.     tilemap_render(ALL_TILEMAPS);
  213.  
  214.     tilemap_draw(bitmap,bgram0_tilemap,0);
  215.     tilemap_draw(bitmap,bgram1_tilemap,0);
  216.     draw_sprites(bitmap);
  217.     tilemap_draw(bitmap,char_tilemap,0);
  218. }
  219.